package cn.tedu._03vehicle.base.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.concurrent.ConcurrentHashMap;

public class RateLimitInterceptor implements HandlerInterceptor {
    private static final int MAX_REQUEST_PER_MINUTE = 3;
    private static final int WINDOW_SIZE_SECONDS = 60;
    private final ConcurrentHashMap<String,Integer> clientCounts = new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, LocalDateTime> clientTimes = new ConcurrentHashMap<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String addr = request.getRemoteAddr();
        LocalDateTime lastTime = clientTimes.get(addr);
        if(lastTime == null || LocalDateTime.now().isAfter(lastTime.plusSeconds((WINDOW_SIZE_SECONDS)))){
           clientCounts.put(addr,0);
           clientTimes.put(addr,LocalDateTime.now());
        }
        Integer count = clientCounts.merge(addr, 1, Integer::sum);
        if(count>MAX_REQUEST_PER_MINUTE){
            throw new RuntimeException("访问次数过于频繁");
        }
        return true;
    }
}
